#ifndef LOGGER_H
#define LOGGER_H

#include <QObject>
#include <QString>
#include <QFile>
#include <QTextStream>
#include <QMutex>
#include <QDateTime>

/**
 * @brief 日志级别枚举
 */
enum class LogLevel
{
    Debug,   // 调试信息
    Info,    // 一般信息
    Warning, // 警告信息
    Error,   // 错误信息
    Critical // 严重错误
};

/**
 * @brief 日志工具类
 *
 * 功能：
 * - 支持多级别日志（Debug、Info、Warning、Error、Critical）
 * - 日志输出到文件和控制台
 * - 线程安全
 * - 自动添加时间戳
 * - 支持日志文件轮转
 */
class Logger : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 获取日志单例
     */
    static Logger *instance();

    /**
     * @brief 初始化日志系统
     * @param logFilePath 日志文件路径
     * @param level 最低日志级别
     * @param enableConsole 是否同时输出到控制台
     */
    void initialize(const QString &logFilePath,
                    LogLevel level = LogLevel::Info,
                    bool enableConsole = true);

    /**
     * @brief 写入日志
     */
    void log(LogLevel level, const QString &message,
             const QString &file = "", int line = 0);

    /**
     * @brief 便捷日志函数
     */
    void debug(const QString &message);
    void debug(const QString &module, const QString &message);
    void info(const QString &message);
    void info(const QString &module, const QString &message);
    void warning(const QString &message);
    void warning(const QString &module, const QString &message);
    void error(const QString &message);
    void error(const QString &module, const QString &message);
    void critical(const QString &message);
    void critical(const QString &module, const QString &message);

    /**
     * @brief 关闭日志系统
     */
    void close();

signals:
    /**
     * @brief 日志信号（可用于界面显示）
     */
    void logMessage(LogLevel level, const QString &message);

private:
    explicit Logger(QObject *parent = nullptr);
    ~Logger();

    Logger(const Logger &) = delete;            // 禁止拷贝构造
    Logger &operator=(const Logger &) = delete; // 禁止赋值操作

    /**
     * @brief 将日志级别转换为字符串
     */
    QString levelToString(LogLevel level) const;

    /**
     * @brief 检查是否需要轮转日志文件
     */
    void checkLogRotation();

private:
    static Logger *m_instance; // 日志单例
    static QMutex m_mutex;     // 互斥锁

    QFile m_logFile;       // 日志文件
    QTextStream m_stream;  // 日志流
    LogLevel m_logLevel;   // 日志级别
    bool m_enableConsole;  // 是否输出到控制台
    QString m_logFilePath; // 日志文件路径

    qint64 m_maxFileSize; // 日志文件大小限制（默认 10MB）
};

// 便捷宏定义
#define LOG_DEBUG(msg) Logger::instance()->debug(msg)
#define LOG_INFO(msg) Logger::instance()->info(msg)
#define LOG_WARNING(msg) Logger::instance()->warning(msg)
#define LOG_ERROR(msg) Logger::instance()->error(msg)
#define LOG_CRITICAL(msg) Logger::instance()->critical(msg)

#endif // LOGGER_H
